﻿using GamFi.Admin.API.Application.Contracts.Wallet.GetWallets;
using GamFi.Admin.API.Application.Exceptions;
using GamFi.Admin.API.Application.Interfaces;
using GamFi.Admin.API.Application.Resources;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;

namespace GamFi.Admin.API.Application.Features.Queries.Wallet.GetWallets;

/// <summary>
/// Обработчик запроса для получения списка кошельков.
/// </summary>
public class GetWalletsQueryHandler : IRequestHandler<GetWalletsQuery, GetWalletsResponse>
{
    private readonly IDbContext _dbContext;
    private readonly IStringLocalizer<ExceptionMessages> _localizer;

    /// <summary>
    /// Конструктор обработчика запроса для получения списка кошельков.
    /// </summary>
    /// <param name="dbContext">Контекст базы данных.</param>
    /// <param name="localizer"></param>
    public GetWalletsQueryHandler(IDbContext dbContext, IStringLocalizer<ExceptionMessages> localizer)
    {
        _dbContext = dbContext;
        _localizer = localizer;
    }

    /// <summary>
    /// Обработка запроса для получения списка кошельков.
    /// </summary>
    /// <param name="request">Запрос на получение списка кошельков.</param>
    /// <param name="cancellationToken">Токен для отмены операции.</param>
    /// <returns>Ответ с списком кошельков.</returns>
    public async Task<GetWalletsResponse> Handle(GetWalletsQuery request, CancellationToken cancellationToken)
    {
        if (request is null)
            throw new RequestException(_localizer[nameof(RequestException.RequestIsEmpty)]);
        
        // Применение пагинации
        var wallets = await _dbContext.Wallets
            .Skip(request.PageNumber * request.PageSize)
            .Take(request.PageSize)
            .ToListAsync(cancellationToken);

        // Маппинг кошельков в GetWalletsResponse
        var response = new GetWalletsResponse
        {
            Wallets = wallets.Select(wallet => new WalletDto
            {
                WalletId = wallet.Id,
                Balance = wallet.Balance,
                UserId = wallet.UserId
            }).ToList()
        };

        return response;
    }
}